/// \file
/// \ingroup tutorial_net
/// Histogram producer script. This script creates a memory mapped
/// file and stores three histogram objects in it (a TH1F, a TH2F and a
/// TProfile). It then fills, in an infinite loop (so use ctrl-c to
/// stop this script), the three histogram objects with random numbers.
/// Every 10 fills the objects are updated in shared memory.
/// Use the hcons.C script to map this file and display the histograms.
///
/// \macro_code
///
/// \author Fons Rademakers

{
   gROOT->Reset();

   // Create a new memory mapped file. The memory mapped file can be
   // opened in an other process on the same machine and the objects
   // stored in it can be accessed.

   TMapFile::SetMapAddress(0xb46a5000);
   mfile = TMapFile::Create("hsimple.map","RECREATE", 1000000,
                            "Demo memory mapped file with histograms");

   // Create a 1d, a 2d and a profile histogram. These objects will
   // be automatically added to the current directory, i.e. mfile.
   hpx    = new TH1F("hpx","This is the px distribution",100,-4,4);
   hpxpy  = new TH2F("hpxpy","py vs px",40,-4,4,40,-4,4);
   hprof  = new TProfile("hprof","Profile of pz versus px",100,-4,4,0,20);

   // Set a fill color for the TH1F
   hpx->SetFillColor(48);

   // Print status of mapped file
   mfile->Print();

   // Endless loop filling histograms with random numbers
   Float_t px, py, pz;
   int ii = 0;
   while (1) {
      gRandom->Rannor(px,py);
      pz = px*px + py*py;
      hpx->Fill(px);
      hpxpy->Fill(px,py);
      hprof->Fill(px,pz);
      if (!(ii % 10)) {
         mfile->Update();       // updates all objects in shared memory
         if (!ii) mfile->ls();  // print contents of mapped file after
      }                         // first update
      ii++;
   }
}
